//
//  UITextView+Emoticon.swift
//  baiqingjianpan
//
//  Created by mac on 15/11/16.
//  Copyright © 2015年 mac. All rights reserved.
//

import UIKit

/**
代码复核 － 对重构完成的代码进行检查

1. 修改注释
2. 确认是否需要进一步重构
3. 再一次检查返回值和参数
*/
extension UITextView {

     /// 图片表情完整字符串内容
    var emoticonText: String {
        
        let attrText = attributedText
        
        var strM = String()
        
        attrText.enumerateAttributesInRange(NSRange(location: 0, length: attrText.length), options: []) { (dict, range, _) -> Void in
            
            // 分段循环的调试技巧
            // 调试结论：如果字典中包含 NSAttachment 说明是图片
            // 否则是字符串，可以通过 range 获得
            // 新问题：如何在 attachment 中增加 `哈哈`
            if let attachment = dict["NSAttachment"] as?  EmoticonAttachment  {
                // print("图片\(attachment.emoticon.chs) ")
                strM += attachment.emoticon.chs ?? ""
                
            } else {
                let str = (attrText.string as NSString).substringWithRange(range)
                
                strM += str
            }
        }
        return strM
    }
    
    
    /// 插入表情符号
    ///
    /// - parameter em: 表情模型
    func insertEmoticon(em: Emoticon) {
        
        // 1 空白表情
        if em.isEmpty {
            return
        }
        //2 删除按钮
        if em.isRemoved {
             deleteBackward()
            return
        }
        
        //emoji
        if let emoji = em.emoji {
             replaceRange( selectedTextRange!, withText: emoji)
            return
        }
        // 4. 图片表情
        insertImageEmoticon(em)
        
        //5 通知 dialing 文本变化了
        delegate?.textViewDidChange?(self)
    }
    
    /// 插入图片表情
    private func insertImageEmoticon(em: Emoticon) {
        // 1. 图片的属性文本
        // 1. 图片的属性文本
        let imageText = EmoticonAttachment(emoticon: em).imageText(font!)
        //2 记录 textView attributeString ->转换成可变文本
        let strM = NSMutableAttributedString(attributedString:  attributedText)
        
        //3 插入图片文本
        strM.replaceCharactersInRange( selectedRange, withAttributedString: imageText)
        //4 替换属性文本
        //1 记录住光标的位置
        let rang =  selectedRange
        // 2 替换文本
         attributedText = strM
        //3 恢复光标
        selectedRange = NSRange(location: rang.location+1, length:0)
    }
    

    
    
    
    
}